package body Bulletins.Bilan is

   -- Fonction permettant de calculer le bilan du bulletin.
   function Resumer (Un_Bulletin : Bulletin) return Bilan is
      Vide : tabMatieres (1 .. 0);
      --LeBilan : Bilan;
      function Parcours (A_Parcourir, Retenues : tabMatieres;
                         Poids_En_Attente, Poids_Total : Natural;
                         Points_Acquis : Natural) return Bilan is
      begin
         if A_Parcourir'Length =  0 then
            if poids_en_attente = 0 then
               return (UnEtatMoyenne => Effective, Moyenne => Points_Acquis / Poids_Total);
               --return (Selon => 0, Un_Objectif => Points_Acquis / Poids_Total, Des_Matieres => Vide);
            elsif Points_Acquis > Un_Bulletin.Un_Objectif * Poids_Total then
               return (UnEtatMoyenne => Effective, Moyenne => Points_Acquis / Poids_Total);
               --return (Selon => 0, Un_Objectif => Points_Acquis / Poids_Total, Des_Matieres => Vide);
            elsif Un_Bulletin.Un_Objectif * Poids_Total > Points_Acquis + Poids_En_Attente * 2000 then
               return (UnEtatMoyenne => PlusProche, Moyenne => (Points_Acquis + Poids_En_Attente * 2000) / Poids_Total);
               --return (Selon => 0, Un_Objectif => (Points_Acquis + Poids_En_Attente * 2000) / Poids_En_Attente, Des_Matieres => Vide);
            else
               return (UnEtatMoyenne => AObtenir, Moyenne => (Un_Bulletin.Un_Objectif * Poids_Total - Points_Acquis) / Poids_En_Attente);
               --return (Selon => Retenues'Length, Un_Objectif => (Un_Bulletin.Un_Objectif * Poids_Total - Points_Acquis) / Poids_En_Attente, Des_Matieres => Retenues);
            end if;
         else
            if Matieres.NoteEstLibre(A_Parcourir (A_Parcourir'First)) = true then
               return
                 Parcours
                   (A_Parcourir => A_Parcourir (A_Parcourir'First + 1 .. A_Parcourir'Last),
                    Retenues => Retenues & A_Parcourir (A_Parcourir'First),
                    Poids_En_Attente => Poids_En_Attente + Matieres.getCoefficient(A_Parcourir (A_Parcourir'First)),
                    Poids_Total=> Poids_Total + Matieres.getCoefficient(A_Parcourir (A_Parcourir'First)),
                    Points_Acquis => Points_Acquis);
            else
               return
                 Parcours
                   (A_Parcourir => A_Parcourir (A_Parcourir'First + 1 .. A_Parcourir'Last),
                    Retenues => Retenues,
                    Poids_En_Attente => Poids_En_Attente,
                    Poids_Total=> Poids_Total + Matieres.getCoefficient(A_Parcourir (A_Parcourir'First)),
                    Points_Acquis =>
                      (Points_Acquis
                       + (Matieres.getValeurNote(A_Parcourir (A_Parcourir'First))
                         * Matieres.getCoefficient(A_Parcourir (A_Parcourir'First)))));
            end if;
         end if;
      end Parcours;
   begin
      return
        Parcours (A_Parcourir => Un_Bulletin.Des_Matieres,
                  Retenues => Vide,
                  Poids_En_Attente => 0,
                  Poids_Total => 0,
                  Points_Acquis => 0);
   end Resumer;



   function getUnEtatMoyenne(b : Bilan) return EtatMoyenne is
   begin
      return b.UnEtatMoyenne;
   end getUnEtatMoyenne;



   function getMoyenne(b : Bilan) return Valeur.Valeur is
   begin
      return b.Moyenne;
   end getMoyenne;



end Bulletins.Bilan;
